package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	num_1 := 0 // 统计数字字符个数
	num_2 := 0 // 统计英文字符个数
	num_3 := 0 // 统计其他字符个数
	// 定义字典用于统计各个字符出现的次数
	num_dict := make(map[int32]int)
	// 从键盘获取字符串，以回车结束输入
	fmt.Println("请输入字符串：")
	reader := bufio.NewReader(os.Stdin)
	num, _ := reader.ReadString('\n')
	// 去除字符串末尾字符 '\n'
	num = num[:len(num)-2]
	for _, numValue := range num {
		num_dict[numValue]++
		if numValue >= 48 && numValue <= 57 {
			num_1++
		} else if (numValue >= 65 && numValue <= 90) || (numValue >= 97 && numValue <= 122) {
			num_2++
		} else {
			num_3++
		}
	}
	// 初始化出现次数最多和最少的字符与次数
	max_char := int32(0)
	min_char := int32(0)
	max_count := 0
	min_count := len(num) + 1
	// 遍历字典，找出出现次数最多和最少的字符
	for key, value := range num_dict {
		if value > max_count {
			max_count = value
			max_char = key
		}
		if value < min_count && value > 0 {
			min_count = value
			min_char = key
		}
	}
	fmt.Printf("数字字符共有%d个，英文字符共有%d个，其他字符共有%d个\n", num_1, num_2, num_3)
	fmt.Printf("出现次数最多的字符是：%c(%v)，共%d次\n", max_char, max_char, max_count)
	fmt.Printf("出现次数最少的字符是：%c(%v)，共%d次\n", min_char, min_char, min_count)
}
